#!/usr/bin/env bash
set -euo pipefail

if [[ $# -lt 1 || $# -gt 2 ]]; then
    echo "Usage: $0 /path/to/rust/project [output-tarball]"
    exit 1
fi

project_dir="$(realpath "$1")"
output_tarball="${2:-$(basename "$project_dir")-vendor.tar.zst}"

if [[ ! -d "$project_dir" ]]; then
    echo "Error: directory does not exist: $project_dir" >&2
    exit 1
fi

if ! command -v cargo >/dev/null 2>&1; then
    echo "Error: cargo is not installed" >&2
    exit 1
fi

if ! command -v tar >/dev/null 2>&1; then
    echo "Error: tar is not installed" >&2
    exit 1
fi

tmpdir="$(mktemp -d)"
trap 'rm -rf "$tmpdir"' EXIT

proj_name="$(basename "$project_dir")"
vendor_dir="$tmpdir/${proj_name}-vendor"

mkdir -p "$vendor_dir"

cd "$project_dir"

# Generate vendored dependencies
cargo vendor "$vendor_dir/vendor" > "$vendor_dir/vendor-config.toml"

# Put the config where packagers usually want it
mkdir -p "$vendor_dir/.cargo"
cp "$vendor_dir/vendor-config.toml" "$vendor_dir/.cargo/config.toml"

# Create tarball
cd ..
tar --zstd -cf "$project_dir/$output_tarball" -C "$tmpdir" "${proj_name}-vendor"

echo "Created: $output_tarball"
echo
echo "Contents:"
echo "  .cargo/config.toml"
echo "  vendor/"
